package com.augurit.common.system.service.org;

import java.util.List;
import java.util.Map;

import org.springside.modules.orm.Page;

import com.augurit.common.base.form.ResultForm;
import com.augurit.common.base.service.IBaseService;
import com.augurit.common.entity.OmOrg;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.system.web.org.form.OmGroupForm;
import com.augurit.common.system.web.org.form.OmOrgForm;
import com.augurit.common.system.web.org.form.OmPositionForm;
import com.augurit.common.system.web.org.form.OmUserForm;

/**
 * 机构部门接口
 */
public interface IOmOrgService extends IBaseService<OmOrgForm, Long> {	

	/**
	 * 根据机构ID获取机构名称
	 * @param id 机构主键
	 * @return 机构名称
	 */
	public String getOrgName(Long id);
	
	public List<OmOrgForm> get(Long[] ids);
	
	/**
	 * 判断该用户是否有该机构列表的管理权限
	 * @param userId 用户主键
	 * @param orgIds 机构主键或主键数组
	 * @return bool 返回该用户是否有机构管理权限.如果有权限返回true，没有权限则返回false
	 */
	public boolean isOrgAdmin(Long userId, Long... orgIds);
	
	/**
	 * 根据用户权限获取机构信息，对象不存在或无权限查看则返回NULL
	 * @param orgId 机构主键
	 * @param userId 用户主键
	 * @return 是否成功获取，若成功获取，返回成功获取的结果，若失败，返回失败的提示信息
	 */
	public ResultForm<OmOrgForm>  get(Long userId, Long orgId);
	
	/**
	 * 根据用户权限删除机构信息，对象不存在则返回NULL，
	 * 是否有权限删除ResultDto<Object>
	 *@param orgIds  机构主键数组
	 *@param userId 管理用户主键
	 *@return ResultDto<Object> 是否删除成功的信息
	 * */
	public ResultForm<Object> delete(Long userId, Long... orgIds);
	
	/**
	 * 注意：如果是修改机构则直接判断用户是否对该机构有管理权限，
	 * 如果是新增机构则判断用户是否对该机构的父机构有管理权限。
	 * 如果用户为超级管理员，则直接调用普通save接口即可。
	 * @param userId
	 * @param forms
	 */
	public ResultForm<Object>  save(Long userId, OmOrgForm form);
	
	/**
	 * 注意：如果是修改机构则直接判断用户是否对该机构有管理权限，
	 * 如果是新增机构则判断用户是否对该机构的父机构有管理权限。
	 * 如果用户为超级管理员，则直接调用普通saveOrgCascade接口即可。
	 * @param userId 用户主键
	 * @param forms 机构form对象
	 */
	public ResultForm<Object> saveOrgCascade(Long userId, OmOrgForm form);
	
	
	/**
	 * 级联删除指定机构及其所有关联的对象
	 * @param orgIds 机构主键或主键数组
	 */
	public void deleteOrgCascade(Long... orgIds);
	
	/**
	 * 级联删除指定机构及其所有关联的对象  方欣删除行政组织
	 * @param orgIds 机构主键或主键数组
	 */
	public void deleteOrgCascadeForFx(Long... orgIds);
	
	
	/**
	 * 根据用户权限，级联删除指定机构及其所有关联的对象；若为超级管理员，
	 * 直接调用普通的deleteOrgCascade方法，普通用户，需要判断用户是否
	 * 有所有机构的权限，返回是否成功级联删除的信息。
	 * @param userId 用户主键
	 * @param orgIds 机构主键或主键数组
	 * @return ResultDto<Object> 是否成功级联删除的信息
	 * */
	public ResultForm<Object>  deleteOrgCascade(Long userId, Long... orgIds);
	
	/**
	 * 根据用户权限获取所有可管理机构ID集合
	 * @param userId 管理用户主键
	 * @return 管理用户可管理的机构主键列表
	 */
	public List<Long> getAuthedOrgIds(Long userId);
	
	public List<OmOrgForm> getAuthedOrgs(Long userId);
	
	/**
	 * 根据用户权限获取所有可管理机构对象集合
	 * @param userId 管理用户主键
	 * @return 管理用户可管理的机构主键列表
	 */
//	public List<OmOrgForm> getManagedOrgs(Long userId);
	
	/**
	 * 根据用户权限获取最上层机构列表
	 * @param userId 管理用户主键
	 * @return 根据管理用户权限获取到的最上层机构列表
	 */
	public List<OmOrgForm> getCanManageTopOrgs(Long userId);
	
	/**
	 * 根据用户权限获取可管理且可继续授权的最上层机构列表
	 * @param authUserId 用户主键
	 * @return
	 */
	public List<OmOrgForm> getCanManageAndAuthTopOrgs(Long authUserId);
	
	/**
	 * 获取最上层机构列表
	 * @return
	 */
	public List<OmOrgForm> getTopOrgs();
	
	/**
	 * 根据机构ID获取关联的直属元素并存放到Form的几个LIST属性中
	 * @param orgId 机构主键
	 * @return
	 */
	public OmOrgForm getOrgRelatedElements(Long orgId);
	
	/**
	 * 获取指定机构的直属子机构列表
	 * @param parentOrgId 父机构ID
	 * @return
	 */
	public List<OmOrgForm> getChildOrgs(Long parentOrgId);
	
	/**
	 * 权限查询指定父机构下的所有具有管理权限并且可继续授权的子机构
	 * @param authUserId 机构管理用户ID
	 * @param parentOrgId 父机构ID
	 */
	public List<OmOrgForm> getCanManageAndAuthChildOrgs(Long authUserId, Long parentOrgId);
	
	/**
	 * 获取指定机构的所有子机构ID列表
	 * @param parentOrgId 父机构主键
	 * @return 机构的所有子机构ID列表
	 */
	public List<Long> getAllChildOrgIds(Long parentOrgId);
	
	/**
	 * 分页获取指定机构的直属子机构列表
	 * @param parentOrgId 父机构ID
	 * @return
	 */
	public Page<OmOrgForm> getChildOrgs(Long parentOrgId, Page<OmOrgForm> page, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 获取指定机构的所有子机构列表，以非树结构组织数据
	 * @param parentOrgId 父机构主键
	 * @return 指定机构的所有子机构列表
	 */
	public List<OmOrgForm> getAllChildOrgs(Long parentOrgId);
	
	/**
	 * 分页获取指定机构的所有子机构列表
	 * @param parentOrgId 父机构主键
	 * @return
	 */
	public Page<OmOrgForm> getAllChildOrgs(Long parentOrgId, Page<OmOrgForm> page);
	
	
	/**
	 * 获取指定机构的树结构子机构及子子机构
	 * @param parentOrgId 父机构主键
	 * @return
	 */
	public List<OmOrgForm> getChildOrgsByTree(Long parentOrgId);
	
	/**
	 * 获取指定机构的直属用户列表
	 * @param orgId 机构主键
	 * @return
	 */
	public List<OmUserForm> getUsers(Long orgId);
	
	/**
	 * 分页获取指定机构的直属用户列表
	 * @param orgId 机构主键
	 * @return
	 */
	public Page<OmUserForm> getUsers(Long orgId, Page<OmUserForm> page);
	
	/**
	 * 获取指定机构的直属岗位列表
	 * @param orgId 机构主键
	 * @return
	 */
	public List<OmPositionForm> getPositionsByOrgId(Long orgId);
	
	/**
	 * 分页获取指定机构的直属岗位列表
	 * @param orgId 机构主键
	 * @return
	 */
	public Page<OmPositionForm> getPositionsByOrg(Long orgId, Page<OmPositionForm> page);
	
	/**
	 * 分页获取指定工作组的直属岗位列表
	 * @param groupId 工作组主键
	 * @return
	 */
	public Page<OmPositionForm> getPositionsByGroup(Long groupId, Page<OmPositionForm> page);
	
	/**
	 * 获取指定机构的直属岗位及其子岗位列表，并且以树结构组织数据
	 * @param orgId 机构主键
	 * @return
	 */
	public List<OmPositionForm> getPositionsByTree(Long orgId);
	
	/**
	 * 移动机构节点到另一机构节点下
	 * @param orgId 本机构主键
	 * @param  parentOrgId 要移动到的目标机构主键
	 */
	public void moveOrg(Long orgId, Long parentOrgId);	
	
	/**
	 * 移动岗位到另一机构节点下
	 * @param posId 岗位ID
	 * @param  targetOrgId 用户所要移到的机构ID
	 */
	public void movePositionToOrg(Long posId, Long targetOrgId);
	
	
	/**
	 * 移动岗位到新父岗位节点下
	 * @param posId 岗位ID
	 * @param  newParentPosId 用户所要移到的新父岗位ID
	 */
	public void movePosition(Long posId, Long targetParentPosId);
	
	
	/**
	 * 移动用户到另一岗位
	 * @param  userId 用户主键
	 * @param oldPosId 用户原来所在的岗位
	 * @param targetPosId 要移动到的岗位主键
	 * */
	public void moveUserToPosition(Long userId,Long oldPosId,Long targetPosId);
	
	/**
	 * 移动用户到另一机构
	 * @param  userId 用户主键
	 * @param targetOrgId 要移动到的机构主键
	 * */
	public void moveUserToOrg(Long userId, Long oldOrgId,Long targetOrgId);
	
	
	/**
	 * 获取指定机构的下级用户，但这些用户与机构的下级岗位以及它们的子子岗位没有关联
	 * @param orgId 指定机构主键盘
	 * @return 用户列表
	 * */
	public List<OmUserForm> getNoPositionUsers(Long orgId);
	
	/**
	 * 判断管理用户是否具有指定机构列表的全部管理权限，分管理用户是超级管理员和普通用户2种
	 * 情况判断，若拥有全部权限，则返回true，否则，返回false；
	 * @param userId 管理用户主键
	 * @param orgIds 指定机构主键或主键数组
	 * @return 管理用户是否具有指定机构列表的全部管理权限
	 * */
	public boolean canManageOrg(Long userId, Long... orgIds);
	
	/**
	 * 根据查询面板的查询条件查询机构，条件为OmOrgForm的5个属性:
	 * orgCode,orgName,orgType,orgGrade,status
	 * @param form 条件查询对象 
	 * @Param page 分页对象
	 * @return 符合条件的分页查询结果
	 * */
	public Page<OmOrgForm> searchOrg(Long adminUserId,OmOrgForm form,Page<OmOrgForm> page, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 根据用户权限，多条件查询查询某个机构下的工作组列表，
	 * 条件为OmGroupForm的4个属性:工作组名称、工作组类型、隶属机构的名称、工作组所在层次
	 * @param adminUserId 用户登录id
	 * @param orgId 机构id
	 * @param form 条件查询对象 
	 * @Param page 分页对象
	 * @return 符合条件的分页查询结果
	 * */
	public Page<OmGroupForm> searchGroupsInOrgByPriv(Long userId, Long orgId, OmGroupForm form,Page<OmGroupForm> page, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 获取全部机构
	 * @return 机构form对象列表
	 */
	public List<OmOrgForm> getAll();
	/**
	 * 分页查询全部机构form 对象
	 * @param page 分页对象
	 * @return 分页处理后的全部机构form 对象
	 * */
	public Page<OmOrgForm> getAll(Page<OmOrgForm> page);
	
	
	/**
	 * 根据机构id数组获取一批机构（包括机构的子机构）下的所有的用户
	 * @param orgIds 机构id数组
	 * @return 用户id数组
	 */
	public Long[] getAllUserIdsByOrgIds(Long[] orgIds);
	
	/**
	 * 获取某一个机构的直属父机构，顶级父机构的父机构为null
	 * @param orgId 机构id
	 * @return 直属父机构id
	 */
	public Long getDirectParentOrgOfOrg(Long orgId);
	
	/**
	 * 获取某一个机构的间接父机构，顶级父机构的间接父机构为null
	 * @param orgId 机构id
	 * @return 间接父机构id列表
	 */
	public List<Long> getIndirectParentOrgOfOrg(Long orgId);
	
	/**
	 * 获取某一个机构的所有父机构（包括直属父机构和间接父机构），顶级父机构的间接父机构为null
	 * @param orgId 机构id
	 * @return 所有父机构id列表
	 */
	public List<Long> getAllParentOrgOfOrg(Long orgId);
	
	/**
	 * 获取某一个用户的所有父机构（包括直属父机构和间接父机构）
	 * @param userId 用户id
	 * @return 所有父机构id列表
	 */
	public List<Long> getAllParentOrgOfUser(Long userId);
	
	/**
	 * 获取授权机构下的所有的子机构，返回结果包括授权机构本身
	 * @adminUserId 管理用户id
	 * @return 获取授权机构下的所有的子机构
	 * */
	public List<Long> getCanManageOrgIds(Long adminUserId);
	
	/**
	 * 获取授权机构下的所有的子机构，返回结果包括授权机构本身
	 * 即获取指定用户所有可授权管理的机构ID列表
	 * @param authUserId 授权用户ID
	 * @param return 获取授权机构下的所有的子机构
	 */
	public List<OmOrgForm> getCanManageOrgs(Long authUserId);

	/**
	 * 带权限的子机构集合查询
	 * @adminUserId 管理用户id
	 * @parentOrgId 父机构id
	 * */
	public List<OmOrgForm> getCanManageChildOrgs(Long adminUserId,Long parentOrgId);
	
	/**
	 * 带权限控制的getNoPositionUsers()方法
	 * @param orgId 指定机构主键盘
	 * @return 用户列表
	 * */
	public List<OmUserForm> getUsersWithNoPostion(Long adminUserId, Long orgId);
	
	/**
	 * 根据管理用户权限，获取指定机构的直属岗位列表
	 * @param orgId 机构主键
	 * @return 机构的直属岗位列表
	 */
	public List<OmPositionForm> getPositions(Long adminUserId,Long orgId);
	
	/**
	 * 主键为adminUserId的管理员给主键为userId的用户授机构管理权限
	 * @authUserId 授权用户ID
	 * @authedUserId 被授权用户ID
	 * @authNewManagedOrgIds 要给用户授权的机构主键列表
	 * */
	public void authManagedOrgs(Long authUserId, Long authedUserId, String auth, Long...authNewManagedOrgIds);
	

	/**
	 * 得到需要删除的机构权限
	 * @param userId 用户id
	 * @param orgIds  要给用户授权的机构主键列表
	 * @return 需要删除的机构主键列表
	 */
//	public List<Long> getNeedDeletedOrgId(Long userId, Long... orgIds);
	
	/**
	 * 获取机构下的工作组
	 * @author 王剑文
	 * @param orgId 机构Id
	 * @return 工作组列表
	 */
	public List<OmGroupForm> getDirectGroups(Long orgId);
	
	/**
	 * 分页获取机构下的工作组
	 * @author 王剑文
	 * @param orgId 机构id
	 * @param page 分页参数
	 * @return 分页工作组对象
	 */
	public Page<OmGroupForm> getDirectGroups(Long orgId, Page<OmGroupForm> page);
	
	/**
	 * 获取工作组的直属机构
	 * @param groupIds
	 * @return
	 */
	public Long[] getDirectParentOrgIds(Long...groupIds);
	
	/**
	 * 获取主键为userId的用户具有管理权限、
	 * 且主键为orgId的机构下具有工作组（可以是直属的、也可以非直属）的直属孩子机构
	 * @userId 用户id
	 * @param orgId 机构id
	 * @return 机构form对象
	 */
	public List<OmOrgForm> getNextLevelOrgOwendGroup(Long userId, Long orgId);
	
	/**
	 * 获取具有工作组的机构列表
	 * @return
	 */
	public List<OmOrgForm> getOrgsOwnedGroup();
	
	/**
	 * 获取指定工作组的直接父机构
	 * @param groupIds 工作组id数组
	 * @return 机构form列表
	 */
	public List<OmOrgForm> getDirectParentOrgs(Long...groupIds);
	
	/**
	 * 获取每个工作组的顶级机构
	 * @author 王剑文
	 * @param userId 用户id
	 * @return
	 */
	public List<OmOrgForm> getTopOrgsOwnedGroup(Long userId);
	
	/**
	 * 获取某个机构下的所有工作组包括直属工作组和间接工作组
	 * @param userId 用户id
	 * @param orgId 机构id
	 * @param page 分页参数
	 * @return 工作组form分页对象
	 */
	public Page<OmGroupForm> getAllGroupsInOrg(Long userId, Long orgId, Page<OmGroupForm> page);
	
	/**
	 * 根据机构code获取机构form对象
	 * @param orgCode
	 * @return
	 */
	public OmOrgForm getOrgByCode(String orgCode);
	
	public List<OmOrgForm> getOrgsByCodeList(List<String> orgCodeList);
	
	public boolean isOrgLikeKeyword(Long orgId,String keyword);
	
	//机构表中是否有匹配的记录
	public boolean hasOrgLikeKeyword(List<OmOrgForm> list,String keyword);

	/**
	 * 根据用户查机构id
	 * @param userId
	 * @return
	 */
	public OmOrg getOrgByUserId(Long userId);
}
